//  This file is part of MOS, the MANTIS Operating System
//  See http://mantis.cs.colorado.edu/
//
//  Copyright (c) 2002 - 2007 University of Colorado, Boulder
//
//   All rights reserved.
//
//   Redistribution and use in source and binary forms, with or without
//   modification, are permitted provided that the following conditions are
//   met:
//
//       * Redistributions of source code must retain the above copyright
//         notice, this list of conditions and the following disclaimer.
//       * Redistributions in binary form must reproduce the above
//         copyright notice, this list of conditions and the following
//         disclaimer in the documentation and/or other materials provided
//         with the distribution. 
//       * Neither the name of the MANTIS Project nor the names of its
//         contributors may be used to endorse or promote products derived
//         from this software without specific prior written permission.
//
//   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
//   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
//   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
//   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
//   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
//   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
//   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
//   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
//   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
//   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//   POSSIBILITY OF SUCH DAMAGE.
#include "plat_dep.h"
#include "led.h"

extern void ostimer_fired(void);


void kernel_timer_init(void)
{
   IPR(0) = (IPR_VALID | PPID_OST_4_11);
   // read back
   uint32_t tmp = IPR(0);

   // start on write, periodic, reset on match, 1 usec  ticks
   OMCR5 = OMCR_C | OMCR_P | OMCR_R | OMCR_CRES(0x4);
   OSMR5 = 1000;

   OIER  |= OIER_E5;
   
   _ICMR(PPID_OST_4_11) |= _PPID_Bit(PPID_OST_4_11);
   tmp = _ICMR(PPID_OST_4_11);
   
   // write to start
   OSCR5 = 0; 
}


static uint8_t foo = 0;

void __attribute__((interrupt("IRQ"))) hplarmv_irq(void)
{
   mos_led_toggle(1);
   
   uint32_t pending;
   
   pending = ICHP;
   pending >>= 16;
  
   
   while(pending & (1 << 15))
   {
      uint8_t id = (pending & 0x3f);
      
      switch(id)
      {
      case PPID_OST_4_11:
	 OSSR = OIER_E5;
	 ostimer_fired();
	 // reset interrupt status
	 break;
	 
      }

      pending = ICHP;
      pending >>= 16;
   }
}
